package br.com.vdn.vo;

import java.io.Serializable;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Formula;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.Proxy;
import org.hibernate.annotations.Type;

import br.com.util.tipodado.Data;
import br.com.util.tipodado.DataHora;
import br.com.util.tipodado.Flag;
import br.com.util.tipodado.InteiroLongo;
import br.com.util.tipodado.Moeda;
import br.com.util.tipodado.Texto;

@Entity
@Table(name="TBVEN")
@Proxy(lazy=true)
public class VendaVo implements Serializable
{
	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "VENCD")
	@GeneratedValue(generator = "InteiroSequenceGenerator")
	@GenericGenerator(name = "InteiroSequenceGenerator", strategy = "br.com.util.tipodado.hibernate.generator.InteiroSequenceGenerator", parameters = { @Parameter(name = "sequence", value = "SQVEN") })
	@Type(type = "br.com.util.tipodado.hibernate.InteiroLongoUT")
	private InteiroLongo codigo;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "CLNCD")
	private ClienteVo clienteVo;
	
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ARQCD")
	private ArquitetoVo arquitetoVo;
	
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "VNDCD")
	private VendedorVo vendedorVo;
	
	@Column(name = "VENDS")
	@Type(type = "br.com.util.tipodado.hibernate.TextoUT")
	private Texto descricao;
	
	@Column(name = "VENVLDSC")
	@Type(type = "br.com.util.tipodado.hibernate.MoedaUT")
	private Moeda valorDesconto;
	
	@Column(name = "VENVLTLT")
	@Type(type = "br.com.util.tipodado.hibernate.MoedaUT")
	private Moeda valorTotal;
	
	@Formula("(VENVLTLT - VENVLDSC)")
	@Type(type = "br.com.util.tipodado.hibernate.MoedaUT")
	private Moeda valorFinal;
	
	@Column(name = "VENFGATV")
	@Type(type = "br.com.util.tipodado.hibernate.FlagUT")
	private Flag flagAtivo;
	
	@Column(name = "VENDT")
	@Type(type = "br.com.util.tipodado.hibernate.DataUT")
	private Data dataVenda;
	
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "USRCDINC")
	private UsuarioVo usuarioInclusaoVo;
	
	@Column(name = "USRDTINC")
	@Type(type = "br.com.util.tipodado.hibernate.DataHoraUT")
	private DataHora dataInclusao;
	
	@ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "USRCDALT")
	private UsuarioVo usuarioAlteracaoVo;
	
	@Column(name = "USRDTALT")
	@Type(type = "br.com.util.tipodado.hibernate.DataHoraUT")
	private DataHora dataAlteracao;
	
	@OneToMany(mappedBy="vendaVo", fetch = FetchType.LAZY)
	@Cascade(CascadeType.ALL)
	private Set<ItensVendaVo> listaItensVenda;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "EDRCDENT")
	private EnderecoVo enderecoEntregaVo;
	
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "EDRCDCBR")
	private EnderecoVo enderecoCobrancaVo;
	
	@Column(name = "VENPRZENT")
	@Type(type = "br.com.util.tipodado.hibernate.TextoUT")
	private Texto prazoEntrega;
	
	@Column(name = "VENVLDORC")
	@Type(type = "br.com.util.tipodado.hibernate.TextoUT")
	private Texto validadeOrcamento;
	
	@Transient
	private FiltroVendaVo filtro;

	public InteiroLongo getCodigo()
	{
		return codigo;
	}

	public void setCodigo(InteiroLongo codigo)
	{
		this.codigo = codigo;
	}

	public ArquitetoVo getArquitetoVo()
	{
		return arquitetoVo;
	}

	public void setArquitetoVo(ArquitetoVo arquitetoVo)
	{
		this.arquitetoVo = arquitetoVo;
	}

	public VendedorVo getVendedorVo()
	{
		return vendedorVo;
	}

	public void setVendedorVo(VendedorVo vendedorVo)
	{
		this.vendedorVo = vendedorVo;
	}

	public Texto getDescricao()
	{
		return descricao;
	}

	public void setDescricao(Texto descricao)
	{
		this.descricao = descricao;
	}

	public Moeda getValorDesconto()
	{
		return valorDesconto;
	}

	public void setValorDesconto(Moeda valorDesconto)
	{
		this.valorDesconto = valorDesconto;
	}

	public Moeda getValorTotal()
	{
		return valorTotal;
	}

	public void setValorTotal(Moeda valorTotal)
	{
		this.valorTotal = valorTotal;
	}

	public Flag getFlagAtivo()
	{
		return flagAtivo;
	}

	public void setFlagAtivo(Flag flagAtivo)
	{
		this.flagAtivo = flagAtivo;
	}

	public UsuarioVo getUsuarioInclusaoVo()
	{
		return usuarioInclusaoVo;
	}

	public void setUsuarioInclusaoVo(UsuarioVo usuarioInclusaoVo)
	{
		this.usuarioInclusaoVo = usuarioInclusaoVo;
	}

	public DataHora getDataInclusao()
	{
		return dataInclusao;
	}

	public void setDataInclusao(DataHora dataInclusao)
	{
		this.dataInclusao = dataInclusao;
	}

	public UsuarioVo getUsuarioAlteracaoVo()
	{
		return usuarioAlteracaoVo;
	}

	public void setUsuarioAlteracaoVo(UsuarioVo usuarioAlteracaoVo)
	{
		this.usuarioAlteracaoVo = usuarioAlteracaoVo;
	}

	public DataHora getDataAlteracao()
	{
		return dataAlteracao;
	}

	public void setDataAlteracao(DataHora dataAlteracao)
	{
		this.dataAlteracao = dataAlteracao;
	}

	public ClienteVo getClienteVo()
	{
		return clienteVo;
	}

	public void setClienteVo(ClienteVo clienteVo)
	{
		this.clienteVo = clienteVo;
	}

	public Set<ItensVendaVo> getListaItensVenda()
	{
		return listaItensVenda;
	}

	public void setListaItensVenda(Set<ItensVendaVo> listaItensVenda)
	{
		this.listaItensVenda = listaItensVenda;
	}

	public FiltroVendaVo getFiltro()
	{
		return filtro;
	}

	public void setFiltro(FiltroVendaVo filtro)
	{
		this.filtro = filtro;
	}

	public Moeda getValorFinal()
	{
		return valorFinal;
	}

	public void setValorFinal(Moeda valorFinal)
	{
		this.valorFinal = valorFinal;
	}

	public Data getDataVenda()
	{
		return dataVenda;
	}

	public void setDataVenda(Data dataVenda)
	{
		this.dataVenda = dataVenda;
	}

	public EnderecoVo getEnderecoEntregaVo()
	{
		return enderecoEntregaVo;
	}

	public void setEnderecoEntregaVo(EnderecoVo enderecoEntregaVo)
	{
		this.enderecoEntregaVo = enderecoEntregaVo;
	}

	public EnderecoVo getEnderecoCobrancaVo()
	{
		return enderecoCobrancaVo;
	}

	public void setEnderecoCobrancaVo(EnderecoVo enderecoCobrancaVo)
	{
		this.enderecoCobrancaVo = enderecoCobrancaVo;
	}

	public Texto getPrazoEntrega()
	{
		return prazoEntrega;
	}

	public void setPrazoEntrega(Texto prazoEntrega)
	{
		this.prazoEntrega = prazoEntrega;
	}

	public Texto getValidadeOrcamento()
	{
		return validadeOrcamento;
	}

	public void setValidadeOrcamento(Texto validadeOrcamento)
	{
		this.validadeOrcamento = validadeOrcamento;
	}

}
